#ifndef AUDIO_RT_FFT_KF_H
#define AUDIO_RT_FFT_KF_H

#include <vector>
#include <kissfft/kiss_fft.h>
#include <kissfft/kiss_fftr.h>
#include <cmath>
#include "utool_AudioRT/Config.h"



constexpr size_t NUM_FRAMES = NUM_TIME;
constexpr size_t FRAME_SIZE = WINDOW_SIZE;
constexpr size_t FFT_BINS = FRAME_SIZE / 2 + 1;

// 麦克风阵列计算相关参数
// 麦克风阵列参数
#define d_Mic (0.015) // 麦克风间距
#define c_Sound (343) // 声速



class FFTProcessor {
public:
    FFTProcessor();
    ~FFTProcessor();

    // 禁用拷贝和移动
    FFTProcessor(const FFTProcessor&) = delete;
    FFTProcessor& operator=(const FFTProcessor&) = delete;

    void compute_spectrum(
        const std::vector<std::vector<__fp16>>& time_data,
        std::vector<std::vector<__fp16>>& mag,
        std::vector<std::vector<__fp16>>& phase
    );
    void compute_spectrum_One(
        const std::vector<std::vector<__fp16>>& time_data,
        std::vector<std::vector<__fp16>>& mag,
        std::vector<std::vector<__fp16>>& phase);
    void reconstruct_signal_Only(
        const std::vector<std::vector<__fp16>>& mag,
        const std::vector<std::vector<__fp16>>& phase,
        std::vector<std::vector<__fp16>>& time_data);
    void reconstruct_signal(
        const std::vector<std::vector<__fp16>>& mag,
        const std::vector<std::vector<__fp16>>& phase,
        std::vector<std::vector<__fp16>>& time_data
    );



private:
    kiss_fft_scalar* fft_in_;      // float
    kiss_fft_cpx*    fft_out_;     // complex
    kiss_fft_scalar* ifft_out_;    // float

    kiss_fftr_cfg cfg_forward_;    // R2C
    kiss_fftr_cfg cfg_inverse_;    // C2R

    // 初始化方法
    void initialize_kissfft();
    void cleanup_kissfft();
};




#endif